「このAWSリソース、手動で作った? CloudFormationで作った?」を調べて解決する
AWSで「このとき、どのような動作をするんだろう?」などを確認することが多いため、AWS環境でよく実験します。 手動ポチポチでササッと作ったり、CloudFormationで作ったり、CloudFormationで作ることが目的だったり様々です。 すぐに作って試せるので非常に便利なのです。次のような場面に遭遇する方は多いのではないでしょうか。
- 見慣れないS3バケット・Lambda関数・Kinesis DataStream・etcがあるぞ?
- 実験した際の消し忘れかな。課金対象になる場合もあるし、早く消そう
- あれ? このAWSリソース、手動で作った? CloudFormationで作った?
CloudFormaionで作成したAWSリソースであれば、CloudFormationで削除すると楽ですし、実験で使ったリソース一式が漏れなく消せます。 そのため、CloudFormationで作成したならCloudFormationから削除したいのですが、調べるのって大変ですよね。
というわけで、AWSリソース名を入力すると、どのCloudFormationスタックで作成したのかを調べるスクリプトを作ってみました。 AWS環境のお掃除の一手間が楽になると思います。
おすすめの方
- 任意のAWSリソースについて、CloudFormationで作成したのか否かを調べたい方
- CloudFormationのスタック一覧を取得したい方
- CloudFormationのリソース一覧を取得したい方
環境
項目 | バージョン |
---|---|
Python | 3.7 |
作成したスクリプト
AWSリソース名を入力すると、どのCloudFormationスタックで作成したのかを調べるスクリプトです。
仕様
CloudFormationの物理IDを確認します。
ソースコード
CloudFormationのスタック一覧を取得し、スタック毎にリソース一覧を取得して確認しているだけです。 下記は部分一致OKですが、AWSリソース名を完全一致にしたい場合は、19行目の判定文を修正すればOKです。
また、CloudFormationのスタック取得(list_stacks()
)は、削除されたスタック情報(90日間)も取得できるため、StackStatusFilter
で除外しています。細かい設定は、必要に応じて実施してください。
import sys import boto3 from typing import List, Dict cfn = boto3.client('cloudformation') def finder(target_resource_id): stacks = get_stacks() found = False for stack in stacks: stack_name = stack['StackName'] resources = get_stack_resources(stack_name) for item in resources: physical_resource_id = item['PhysicalResourceId'] resource_type = item['ResourceType'] if target_resource_id in physical_resource_id: print(f'{stack_name}: {resource_type}, {physical_resource_id}') found = True if found is False: print(f'{target_resource_id} is not found in CloudFormation resources.') def get_stacks(token: str=None) -> List[Dict]: """スタック一覧を取得する""" # https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ListStacks.html option = { 'StackStatusFilter': [ 'CREATE_COMPLETE', 'UPDATE_COMPLETE', 'ROLLBACK_COMPLETE' ] } if token is not None: option['NextToken'] = token res = cfn.list_stacks(**option) stacks = res.get('StackSummaries', []) if 'NextToken' in res: stacks += get_stacks(res['NextToken']) return stacks def get_stack_resources(stack_name: str, token: str=None) -> List[Dict]: """指定したスタックのリソース一覧を取得する""" option = { 'StackName': stack_name } if token is not None: option['NextToken'] = token res = cfn.list_stack_resources(**option) resources = res.get('StackResourceSummaries', []) if 'NextToken' in res: resources += get_stack_resources(res['NextToken']) return resources if __name__ == "__main__": args = sys.argv if len(args) == 2: finder(args[1])
使い方
下記のように実行するだけです。引数に調べたいAWSリソース名を指定します。
python finder.py aws-resource-name
実際の動作例
CloudFormationで作成したリソースの場合
AWSリソース名として、chouseisan-reminder-function
を調べます。部分一致のため複数Hitしています。
$ python finder.py chouseisan-reminder-function Chouseisan-Reminder-Stack: AWS::Lambda::Function, chouseisan-reminder-function Chouseisan-Reminder-Stack: AWS::Logs::LogGroup, /aws/lambda/chouseisan-reminder-function
バッチリですね。
手動で作成したリソースの場合
CloudFormationのリソース内では見つかりませんでした。バッチリですね。
$ python finder.py firehose_test firehose_test is not found in CloudFormation resources.
さいごに
AWS環境のお掃除などで役に立つと思います。
実験の名残としてfirehose_test
が残り続けていることに気づいたので、ついでに削除しました。